/*
 * Source code written by Tácio S. Diogo.
 * Email: taciosd@gmail.com
 * Any copy or use without permission is prohibited.
 */
package app.agentes;

import app.modelo.Propaganda;
import jade.core.Agent;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 *
 * @author Tácio S. Diogo
 */
public abstract class Agente extends Agent {
    public static final double CONSCIENCIA_MAXIMA = 1.0;
    public static final double ETICA_MAXIMA = 1.0;
    
    protected Map<String, Double> reputacoes;
    private Propaganda propaganda;
    private double conscienciaPolitica;
    private double etica;
    
    public Agente() {
        reputacoes = new HashMap<String, Double>();
        setConscienciaPolitica(CONSCIENCIA_MAXIMA);
        setEtica(ETICA_MAXIMA);
    }
    
    public void atualizarReputacao(String nomeAgente, Double fator) {
        Double valor = 0.5;
        
        if (reputacoes.containsKey(nomeAgente)) {
            valor = reputacoes.get(nomeAgente);
        }
        
        Double valorAtualizado = valor + fator;
        
        if (valorAtualizado.doubleValue() > 1.0) {
            valorAtualizado = 1.0;
        } else if (valorAtualizado.doubleValue() < 0.0) {
            valorAtualizado = 0.0;
        }
        
        reputacoes.put(nomeAgente, valorAtualizado);
    }
   
    public Double obterReputacao(String nomeAgente){
        if (!reputacoes.containsKey(nomeAgente)) {
            reputacoes.put(nomeAgente, 0.5);
        }
        return reputacoes.get(nomeAgente);
    }
    
    
    public void setPropagandaAtual(Propaganda propaganda) {
        this.propaganda = propaganda;
    }
    
    public Propaganda getPropagandaAtual() {
        return propaganda;
    }

    public double getConscienciaPolitica() {
        return conscienciaPolitica;
    }

    public double getEtica() {
        return etica;
    }

    public final void setConscienciaPolitica(double conscienciaPolitica) {
        this.conscienciaPolitica = conscienciaPolitica;
    }

    public final void setEtica(double etica) {
        this.etica = etica;
    }
    
    public String getNomeCandidatoMaiorReputacao() {
        Set<Entry<String, Double>> valores = reputacoes.entrySet();
        Iterator iterator = valores.iterator();
        Double maiorValor = new Double(0);
        String nomeCandidato = "";
                
        while (iterator.hasNext()) {
            Object obj = iterator.next();
            Entry<String, Double> entry = (Entry<String, Double>) obj;
            Double valor = entry.getValue();
            if (valor > maiorValor) {
                maiorValor = valor;
                nomeCandidato = entry.getKey();
            }
        }
        
        return nomeCandidato;
    }
}
